package controleur;



import hibernate.HibernateUtil;
import hibernate.HistoriqueVentes;
import hibernate.Prevision;
import hibernate.siteProduit;
import java.text.DateFormat;

import java.text.DateFormat;
import java.util.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import net.sf.hibernate.Session;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.odmg.Transaction;
import net.sf.hibernate.type.YesNoType;



/**
 * Servlet implementation class Servlet
 */
public class Calculmethodes{
	
public Calculmethodes()
{
}
protected void methodemmcHorizon1(siteProduit siteproduit) throws HibernateException{
	
	HistoriqueVentes historique=null;
	
	Session session = HibernateUtil.currentSession();
	

	/*reccuperationde l'ann�e en cours et du mois*/
	int num_annee;
	int num_mois;
	Calendar date= Calendar.getInstance();
	Calendar date2;
	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
			Locale.FRANCE);
	num_annee=date.get(date.YEAR);

	num_mois=date.get(date.MONTH);
	/*reccuperation en base de l'ann�e de ventes precedentes*/
	
	Date date_test= new Date();
	//Date date_query= new Date();
	//date_query.setDate(1);
	//date_query.setYear(year);
	//date_query.setMonth(month);
	List<?> list = session.find("from HistoriqueVentes where date >'"+(num_annee-1) +"-"+(num_mois) +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit()+" AND date <'"+(num_annee) +"-"+(num_mois) +"-01' ");
	/*somme de toutes les ventes de l'ann�e*/
	
	Iterator<?> itlist = list.iterator();
	while (itlist.hasNext()) {
	
		System.out.println("plop2");
		historique= (HistoriqueVentes) itlist.next();
		inserer_prevision(historique, siteproduit);
		
		
	}
	

	

	
}
	private void inserer_prevision(HistoriqueVentes historique, siteProduit siteproduit) throws HibernateException {
	// TODO Auto-generated method stub
		Session session = HibernateUtil.currentSession();
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		Date date_test= new Date();
		
		Prevision prev = new Prevision();
		prev.setIdProduit(siteproduit.getIdProduit());
		prev.setIdSite(siteproduit.getIdSite());
		prev.setMethode("M2");
		prev.setHorizonPasse(1);
		prev.setHorizonFutur(1);
		prev.setDate_Calcul(date_test);
		System.out.println(date_test.toString());
		float tmp;
		tmp=historique.getQuantite();
		int tmp2;
		tmp2=(int)Math.ceil(tmp);
		prev.setQuantite(tmp2);
		Date Date_prev = historique.getDate();
		Date_prev.setYear(Date_prev.getYear()+1);
		prev.setDate(Date_prev);
		prev.setLevier("");
		prev.setValeur(0);
		//prev.setMois(historique.getMois());
		//prev.setAnnee(historique.getAnnee()+1);
		
		net.sf.hibernate.Transaction tx = session.beginTransaction();
		
		session.save(prev);
		tx.commit();
		HibernateUtil.closeSession();
		
	
}
	/*methode des moindre carr�e*/
	protected void methodemmc(siteProduit siteproduit, int horizon_passe) throws HibernateException{
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		HistoriqueVentes historique=null;
		
		Session session = HibernateUtil.currentSession();
		
		List<Float> List_Moy= new ArrayList<Float>();
		/*recuperation de l'ann�e en cours*/
		int num_annee;
		int num_mois;
		Calendar date= Calendar.getInstance();
		
		num_annee=date.get(date.YEAR);
		num_mois=date.get(date.MONTH);

	
		/*reccuperation en base des 5 ann�e de ventes precedentes*/
		
		for(int i= horizon_passe;i>0;i--)
		{
			/*recherche dans la base l'hitorique de  l'ann�e n-i*/
			
		List<?> list = session.find("from HistoriqueVentes where date >='"+(num_annee-i) +"-"+(num_mois) +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit()+" AND date <'"+(num_annee-i+1) +"-"+(num_mois) +"-01' ");
		/*somme de toutes les ventes de l'ann�e*/
		float somme=0;
		Iterator<?> itlist = list.iterator();
		while (itlist.hasNext()) {

			historique= (HistoriqueVentes) itlist.next();
			somme = somme +historique.getQuantite();
			System.out.println(somme);
			}
		List_Moy.add(somme);
		System.out.println("plop");
		}
		
		
		//calcul  des la pr�vision globale de l'ann�e Y=AX+B
		float Prev=Moindrecarree(horizon_passe,List_Moy);
	
		//Insertion en base des valeurs trouv�es

		List<Float> List_tot = new ArrayList <Float> ();
		System.out.println(Prev);
		List_tot=methodecoeff(Prev,siteproduit,horizon_passe);
	
		
		Date date_test= new Date();
		session = HibernateUtil.currentSession();
		

		Iterator<?> itlist2 = List_tot.iterator();
		
		int compteur=0;
		while(itlist2.hasNext())
		{
			float tmp;
			tmp=(Float) itlist2.next();
			
			inserer_prevision2(siteproduit,horizon_passe,tmp,compteur,num_annee,num_mois);
		
		
		
		compteur++;
		}

		
		
		HibernateUtil.closeSession();
	}
	
	
	
	
	public float Moindrecarree(int horizon_passe, List<Float> List_Moy) {
		// TODO Auto-generated method stub
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		int i;
		Float J;
		Float Esperance_XY=(float) 0;
		Float Esperance_X=(float) 0;
		Float Esperance_Y=(float) 0;
		Float X2=(float) 0;
		Float CovXY=(float) 0;
		Float Variance_X=(float) 0;
		Float A=(float) 0;
		Float B=(float) 0;
		Float Prev=(float) 0;
		
		List<Float> List_XY = new ArrayList <Float> ();
		
	
		
		for (i=0;i<horizon_passe;i++)
		{

		J=(i+1) * List_Moy.get(i);
		List_XY.add(J);

		}
		//calcul des esp�rences de x , y et xy
		
		for (i=0;i<horizon_passe;i++)
		{

			Esperance_XY = Esperance_XY + List_XY.get(i);
			Esperance_X = Esperance_X + (i+1);
			Esperance_Y = Esperance_Y + List_Moy.get(i);
			X2 = X2 + (i+1)*(i+1);

		}
		
		Esperance_XY = Esperance_XY/horizon_passe;
		Esperance_X = Esperance_X/horizon_passe;
		Esperance_Y = Esperance_Y/horizon_passe;
	
		X2 = X2/horizon_passe;
		
		CovXY= Esperance_XY - Esperance_X * Esperance_Y;
		Variance_X = X2 - ( Esperance_X * Esperance_X);
		A = CovXY / Variance_X;
		B = Esperance_Y - A * Esperance_X;
		Prev = (horizon_passe + 1) * A + B;
		return Prev;
	}
	private void inserer_prevision2(siteProduit siteproduit, int horizon_passe, float tmp, int compteur, int num_annee, int num_mois) throws HibernateException {
		// TODO Auto-generated method stub
		Calendar date= Calendar.getInstance();
		Session session = HibernateUtil.currentSession();
		Prevision prev = new Prevision();
		Date date_test= new Date();
		
		Date actuelle = new Date();
		prev.setIdProduit(siteproduit.getIdProduit());
		prev.setIdSite(siteproduit.getIdSite());
		prev.setMethode("M2");
		prev.setHorizonPasse(horizon_passe);
		prev.setHorizonFutur(1);
		prev.setDate_Calcul(actuelle);
	
		int tmp2;
		tmp2=(int)Math.ceil(tmp);
		prev.setQuantite(tmp2);
		if(compteur+num_mois<12)
		{
			Date date_prev=date_test;
			date_prev.setMonth(compteur+num_mois);
			date_prev.setYear(num_annee-1900);
			date_prev.setDate(1);
			prev.setDate(date_prev);
			prev.setLevier("");
			prev.setValeur(0);
			net.sf.hibernate.Transaction tx = session.beginTransaction();
			session.save(prev);
			tx.commit();
		//prev.setMois(compteur+num_mois);
		//prev.setAnnee(num_annee);
		}
		else
		{
			Date Date_prev2=date_test;
			Date_prev2.setMonth(compteur+num_mois-12);
			Date_prev2.setYear(num_annee-1899);
			Date_prev2.setDate(1);
			System.out.println(Date_prev2.toString());
			prev.setDate(Date_prev2);
			prev.setLevier("");
			prev.setValeur(0);

			net.sf.hibernate.Transaction tx = session.beginTransaction();
			session.save(prev);
			tx.commit();
		}
	}
	
	/*coefficient saisonier calcul des pr�visions par mois*/
	public List<Float> methodecoeff(float prev,siteProduit siteproduit, int horizon_passe) throws HibernateException{
		
		Session session = HibernateUtil.currentSession();
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		
	

		List<Float> Prev_annee=new ArrayList <Float> ();
		List<Float> List_Jan = new ArrayList <Float> ();
		List<Float> List_Fev = new ArrayList <Float> ();
		List<Float> List_Mar = new ArrayList <Float> ();
		List<Float> List_Avr = new ArrayList <Float> ();
		List<Float> List_Mai = new ArrayList <Float> ();
		List<Float> List_Jun = new ArrayList <Float> ();
		List<Float> List_Jui = new ArrayList <Float> ();
		List<Float> List_Aou = new ArrayList <Float> ();
		List<Float> List_Sep = new ArrayList <Float> ();
		List<Float> List_Oct = new ArrayList <Float> ();
		List<Float> List_Nov = new ArrayList <Float> ();
		List<Float> List_Dec = new ArrayList <Float> ();
		HistoriqueVentes historique=null;
		int num_annee;
		int num_mois;
		Calendar date= Calendar.getInstance();
		num_annee=date.get(date.YEAR);
		num_mois=date.get(date.MONTH);
		
		
		for(int i=horizon_passe;i>0;i--)
		{
			System.out.println(i);
			
			for(int j=1;j<=12;j++)
			{
				float somme=0;
			/*recherche dans la base de  l'ann�e n-i*/
			
				if(j>4)
					{List<?> list = session.find("from HistoriqueVentes where date ='"+(num_annee-i) +"-"+j +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit());
				System.out.println("from HistoriqueVentes where date ='"+(num_annee-i) +"-"+j +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit() );
				 somme=0;
				Iterator<?> itlist = list.iterator();
				while (itlist.hasNext()) {

					historique= (HistoriqueVentes) itlist.next();
					somme = somme +historique.getQuantite();
			
			
				}
					}
				
				else
					{
					List<?>list2 = session.find("from HistoriqueVentes where date ='"+(num_annee-i+1) +"-"+j +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit());
				System.out.println("from HistoriqueVentes where date ='"+(num_annee-i+1) +"-"+j +"-01' and id_site="+siteproduit.getIdSite()+" and id_produit="+siteproduit.getIdProduit() );
				somme=0;
				Iterator<?> itlist2 = list2.iterator();
				while (itlist2.hasNext()) {

					historique= (HistoriqueVentes) itlist2.next();
					somme = somme +historique.getQuantite();
			
			
				}
					}

		/*somme de toutes les ventes de l'ann�e*/
	
		
		switch(j)
		{
		
		case 6: List_Jan.add(somme);break;
		case 7: List_Fev.add(somme);break;
		case 8: List_Mar.add(somme);break;
		case 9: List_Avr.add(somme);break;
		case 10: List_Mai.add(somme);break;
		case 11: List_Jun.add(somme);break;
		case 12: List_Jui.add(somme);break;
		case 1: List_Aou.add(somme);break;
		case 2: List_Sep.add(somme);break;
		case 3: List_Oct.add(somme);break;
		case 4: List_Nov.add(somme);break;
		case 5: List_Dec.add(somme);break;
		default : break;
		}
	
		}	
	}
		
  Prev_annee=Coeff(prev,horizon_passe,List_Jan,List_Fev,List_Mar,List_Avr,List_Mai,List_Jun,List_Jui,List_Aou,List_Sep,List_Oct,List_Nov,List_Dec);

return Prev_annee;
		
	}
	public List<Float> Coeff(float prev, int horizon_passe, List<Float> List_Jan, List<Float> List_Fev, List<Float> List_Mar, List<Float> List_Avr, List<Float> List_Mai, List<Float> List_Jun, List<Float> List_Jui, List<Float> List_Aou, List<Float> List_Sep, List<Float> List_Oct, List<Float> List_Nov, List<Float> List_Dec) {
		// TODO Auto-generated method stub
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		float tot=0;
		List<Float> Prev_annee=new ArrayList <Float> ();
		float Jan=0;
		float Fev=0;
		float Mar=0;
		float Avr=0;
		float Mai=0;
		float Jun=0;
		float Jui=0;
		float Aou=0;
		float Sep=0;
		float Oct=0;
		float Nov=0;
		float Dec=0;
		float Coef_Jan=0;
		float Coef_Fev=0;
		float Coef_Mar=0;
		float Coef_Avr=0;
		float Coef_Mai=0;
		float Coef_Jun=0;
		float Coef_Jui=0;
		float Coef_Aou=0;
		float Coef_Sep=0;
		float Coef_Oct=0;
		float Coef_Nov=0;
		float Coef_Dec=0;

		
		
		
		
		for (int i=0;i<horizon_passe;i++)
		{
			Jan = Jan + List_Jan.get(i);
			Fev = Fev + List_Fev.get(i);
			Mar = Mar + List_Mar.get(i);
			Mai = Mai + List_Mai.get(i);
			Avr = Avr + List_Avr.get(i);
			Jun = Jun + List_Jun.get(i);
			Jui = Jui + List_Jui.get(i);
			Aou = Aou + List_Aou.get(i);
			Sep = Sep + List_Sep.get(i);
			Oct = Oct + List_Oct.get(i);
			Nov = Nov + List_Nov.get(i);
			Dec = Dec + List_Dec.get(i);

		
		
		}
		
		 Jan=Jan/horizon_passe;
		 Fev=Fev/horizon_passe;
		 Mar=Mar/horizon_passe;
		Avr=Avr/horizon_passe;
		 Mai=Mai/horizon_passe;
		 Jun=Jun/horizon_passe;
		 Jui=Jui/horizon_passe;
		 Aou=Aou/horizon_passe;
		 Sep=Sep/horizon_passe;
		 Oct=Oct/horizon_passe;
		 Nov=Nov/horizon_passe;
		 Dec=Dec/horizon_passe;
		 
		tot=Jan+Fev+Mar+Avr+Mai+Jun+Jui+Aou+Sep+Oct+Nov+Dec;
		
		Coef_Jan=Jan/tot;
		Coef_Fev=Fev/tot;
		Coef_Mar=Mar/tot;
		Coef_Avr=Avr/tot;
		Coef_Mai=Mai/tot;
		Coef_Jun=Jun/tot;
		Coef_Jui=Jui/tot;
		Coef_Aou=Aou/tot;
		Coef_Sep=Sep/tot;
		Coef_Oct=Oct/tot;
		Coef_Nov=Nov/tot;
		Coef_Dec=Dec/tot;
		Prev_annee.add(Coef_Jan*prev);
		Prev_annee.add(Coef_Fev*prev);
		Prev_annee.add(Coef_Mar*prev);
		Prev_annee.add(Coef_Avr*prev);
		Prev_annee.add(Coef_Mai*prev);
		Prev_annee.add(Coef_Jun*prev);
		Prev_annee.add(Coef_Jui*prev);
		Prev_annee.add(Coef_Aou*prev);
		Prev_annee.add(Coef_Sep*prev);
		Prev_annee.add(Coef_Oct*prev);
		Prev_annee.add(Coef_Nov*prev);
		Prev_annee.add(Coef_Dec*prev);
		return Prev_annee;
	}

}
